// lazyman
// 有sleep功能， 函数不能直接在调用时触发
// 初始化一个列表， 把函数注册进去
// 由每个item 触发 next 执行 遇到sleep 则异步触发
// 把所有函数注入 列表， 然后依次执行， 遇到异步则执等待结束再依次触发


// 重点 任务队列  触发 next  sleep 异步触发

class Lazyman1 {
  private name: string
  private tasks: Function[] = []
    
  constructor(name: string) {
    this.name = name

    setTimeout(() => { // 创建了实例时，tasks 还是空，用异步先加载tasks
      this.next()
    }) 
  }

  // next
  private next() {
    const task = this.tasks.shift() //  取出当前tasks的第一个任务
    if(task) task()
  }

  eat(food: string) {
    const task = () => {
      console.log(`${this.name} eat ${food}`);
      this.next() // 立刻执行
    }
    this.tasks.push(task)
    return this
  }

  sayHi(name: string) {
    const task = () => {
      console.log(`${name}: say HI`);
      this.next()
    }
    this.tasks.push(task)
    return this
  }


  sleep(seconds: number) {
    const task = () => {
      console.log(`开始睡眠: ${seconds} 秒`);
      setTimeout(() => {
        console.info(`${this.name} 已经 睡完了 ${seconds}`)
        this.next()
      }, seconds * 1000)
    }
    this.tasks.push(task)
    return this
  }
}

const me = new Lazyman1('kk')
me.eat('orange').eat('apple').sayHi('ykk').sayHi('ua')